home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / HAMRADIO / WEFAX.ZIP / REALTIME.ASM < prev    next >
Assembly Source File  |  1984-06-06  |  4KB  |  146 lines

  1. title           REALTIME.ASM
  2. ;        by: e. w. schwittek (last revised 6/6/84)
  3.  
  4. page ,132
  5.  
  6. ;equates:
  7. aport        equ [0201h] ;game port
  8. sample_delay    equ 60
  9. line_delay    equ 15421
  10.  
  11. data        segment
  12. fullbyte    db 0 ;sample collection byte
  13. count_0        db 0 ;causes alternate pix mem selection
  14. count_4        db 4 ;4 samples of 2 bits each make fullbyte
  15. count_80    db 80 ;80 bytes per picture line
  16. count_200    db 200 ;200 lines per picture
  17. sampl_delay_ctr dw 0 ;set to sample_delay value after dec to 0
  18. line_delay_ctr  dw 0 ;set to line_delay value after dec to 0
  19. equalizer_delay dw 1 ;value equalizes sample rate
  20. data        ends
  21.  
  22. destination    segment at 0b800h ;begins seg at b800h
  23. pixlow        db 8000 dup(0) ;8000 bytes set to 0
  24.         org 2000h ;begins pixhigh (high half of graghics
  25. ;        memory) at b800:2000
  26. pixhigh        db 8000 dup(0) ;8000 bytes set to 0
  27. destination    ends
  28.  
  29. code        segment
  30. start        proc  far
  31.         assume ds:data,es:destination,cs:code
  32.  
  33.  ;save bp,es,ss and ds for return to basic program
  34.         push bp ;save bp
  35.         mov bp,sp ; get current stack position into bp
  36.         push es
  37.         push ss
  38.         push ds
  39.  
  40. ;this proc gets value of "a" fm basic program
  41.         mov si,[bp]+6 ;get addr of para a into si
  42.         mov ax,[si] ;get value of para a
  43.         mov si,ax ; put para a into si for storage
  44.  
  45. ;establish addressability for data segment
  46.         mov ax,cs
  47.         add ax,si
  48.         add ax,14
  49.         mov ds,ax
  50.  
  51. ;establish addressability for destination segment
  52.         mov ax,destination ;get es base addr
  53.         mov es,ax ;give es base addr
  54.  
  55. ;initializes registers
  56.         sub ax,ax
  57.         sub di,di
  58.         mov bx,0000h
  59.  
  60. ;sync start routine
  61.         mov cx,255
  62. sync_start:    mov dx,aport
  63.         in al,dx ;put aport into al
  64.         cmp al,64 ;carry flag at 0 if al=>64
  65.         jae sync_start ;jump on cf=0
  66.         loop sync_start
  67.  
  68. ;sample port and store two bits in fullbyte
  69. begin:        mov dx,aport
  70.         in al,dx ;put aport into al
  71.         rcl al,1 ;put bit 7 of aport in carry flag
  72.         rcl fullbyte,1 ;put carry flag in bit 0 of fullbyte
  73.         rcl al,1 ;put bit 6 of aport in carry flag
  74.         rcl fullbyte,1 ;put carry flag in bit 0 of fullbyte 
  75. ;        and move bit 0 to position 1
  76.  
  77. ;cause delay for proper sample rate
  78.         mov ax,sample_delay
  79.         mov sampl_delay_ctr,ax ;set-reset sampl delay ctr
  80. sample:        dec sampl_delay_ctr
  81.         jnz sample
  82.  
  83. ;fill fullbyte with 8 bits
  84.         dec count_4
  85.         jnz equalizer
  86.         mov count_4,4 ;reset counter
  87.         jmp make_line
  88.  
  89. ;equalize delay between first three samples and forth sample
  90. equalizer:    dec equalizer_delay
  91.         jnz equalizer
  92.         mov equalizer_delay,1 ;reset counter
  93.         jmp begin ;get another 2 bit sample
  94.  
  95. ;establish fullbyte at proper graphics memory position
  96. make_line:    mov al,fullbyte
  97.         mov es:[bx+di],al ;fullbyte to pixlow + di
  98.         inc di ;next fullbyte one position right
  99.         dec count_80 ;completes 80-byte line
  100.         mov fullbyte,0 ;reset fullbyte to 0
  101.         jnz begin
  102.         mov count_80,80 ;reset counter
  103.  
  104. ;determine which graphics range we were in, pixlow or pixhigh
  105.         sub count_0,0
  106.         jnz count_is_one
  107.  
  108. count_is_zero:    mov bx,02000h ;changes graphics mem range
  109.         inc count_0 ;sets count for next pass
  110.         sub di,80 ;sets di to beginning of next line
  111.         jmp joint
  112.  
  113. count_is_one:    mov bx,0000h ;change graphics mem range
  114.         dec count_0 ;sets count_0 for next pass
  115.         add di,0 ;sets di to beginning of next line
  116.         jmp joint
  117.  
  118. ;make 200 lines
  119. joint:        mov ax,line_delay
  120.         mov line_delay_ctr,ax ;set-reset line delay ctr
  121. line:        dec line_delay_ctr
  122.         jnz line
  123.         mov line_delay_ctr,ax ;reset line delay ctr
  124. line1:        dec line_delay_ctr
  125.         jnz line1
  126.         mov line_delay_ctr,ax ;reset line delay ctr
  127. line2:        dec line_delay_ctr
  128.         jnz line2
  129.         mov line_delay_ctr,ax ;reset line delay ctr
  130. line3:            dec line_delay_ctr
  131.         jnz line3
  132.                 dec count_200 ;counting total picture lines
  133.         jz finish
  134.         jmp begin
  135.  
  136. finish:        pop ds
  137.         pop ss
  138.         pop es
  139.  
  140.         mov sp,bp
  141.         pop bp ;restore stack
  142.                 ret 2 ;far return to basic
  143. start        endp
  144. code        ends
  145.         end
  146.